home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / cv_set6 / cv_set6s.lzh / BMP2GLX.S < prev    next >
Text File  |  1997-09-28  |  47KB  |  2,257 lines

  1. *********************************************************************************
  2. *    BMP to GLX converter                <BMP2GLX.X Ver0.01>    *
  3. *********************************************************************************
  4.  
  5.     .include    doscall.mac
  6.     .include    iocscall.mac
  7.     .include    myconst.h
  8.  
  9. WIN3        equ    40
  10. OS2v1        equ    12
  11. OS2v2        equ    64
  12.  
  13. file_header:
  14. f_type:        equ    0        *ファイル識別子 'BM'
  15. f_size:        equ    2        *ファイルのサイズ
  16. f_reserved1:    equ    6        *予備1
  17. f_reserved2:    equ    8        *予備2
  18. f_offbits:    equ    10        *ファイル先頭からイメージデータへのオフセット
  19.  
  20. WIN3_HED:
  21. win3_size:    equ    14        *これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
  22. win3_width:    equ    18        *横サイズ
  23. win3_height:    equ    22        *縦サイズ
  24. win3_planes:    equ    26        *使用プレーン数
  25. win3_bitcount:    equ    28        *色数 (1:2色,4:16色,8:256色,24:16777216色)
  26. win3_comp:    equ    30        *圧縮アルゴリズム (0:無圧縮,1:rle8,2:RLE4)
  27. win3_size_image    equ    34        *イメージデータのサイズ
  28. win3_xpels_pm:    equ    38        *X方向のディスプレイ分解能
  29. win3_ypels_pm:    equ    42        *Y方向のディスプレイ分解能
  30. win3_clr_used:    equ    46        *色変換テーブルの大きさ
  31. win3_clr_imp:    equ    50        *重要な色の数
  32.  
  33. OS21_HED:
  34. os21_size:    equ    14        *これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
  35. os21_width:    equ    18        *横サイズ
  36. os21_height:    equ    20        *縦サイズ
  37. os21_planes:    equ    22        *使用プレーン数
  38. os21_bitcount:    equ    24        *色数 (1:2色,4:16色,8:256色,24:16777216色)
  39.  
  40.     .text
  41.     .even
  42.  
  43. start:
  44.     lea.l    mysp(pc),sp        *スタックセット
  45.     lea.l    work(pc),a6
  46.  
  47.     lea.l    16(a0),a0        *余分なメモリ開放
  48.     suba.l    a0,a1
  49.     move.l    a1,-(sp)
  50.     move.l    a0,-(sp)
  51.     DOS    _SETBLOCK
  52.     addq.l    #8,sp
  53.  
  54.     bsr    cmdchk            *コマンドラインの解析
  55.     bsr    s_name_chk        *セーブファイル名のチェック
  56.     bsr    buf_get            *バッファ確保
  57.     bsr    name_get        *ファイル名を取得し処理する
  58.     bsr    buf_free        *バッファ開放
  59.     bsr    exit            *終了処理
  60.     DOS    _EXIT
  61.  
  62. *****************************************************************
  63. *    ファイル名を取得し、ファイルの読み込みを行う        *
  64. *****************************************************************
  65. name_get:
  66.     clr.w    file_cnt(a6)        *ファイル数のカウント初期化
  67.  
  68.     bsr    chkname            *ファイル名に対する前処理
  69.     bsr    chkext            *拡張子が省略されているかチェック
  70.  
  71.     move.w    #ARCHIVE,-(sp)        *最初のファイルを検索する
  72.     pea.l    arg1(a6)        *
  73.     pea.l    filbuf(a6)        *
  74.     DOS    _FILES            *
  75.     lea.l    10(sp),sp        *
  76.  
  77. loop:
  78.     tst.l    d0            *ファイルは見つかったか?
  79.     bmi    done            * 見つからなければ処理完了
  80.  
  81.     bsr    setpath            *得られたファイル名を
  82.                     * フルパスに再構成する
  83.  
  84.     bsr    main            *メイン処理
  85.  
  86.     pea.l    filbuf(a6)        *つぎのファイルを検索する
  87.     DOS    _NFILES            *
  88.     addq.l    #4,sp            *
  89.  
  90.     bra    loop            *繰り返す
  91.  
  92. done:
  93.     bsr    file_cnt_chk        *処理したファイル数のチェック
  94.     rts
  95.  
  96. *****************************************************************
  97. *    files実行に先立ってファイル名に前処理を加える        *
  98. *****************************************************************
  99. chkname:
  100.     pea.l    nambuf(a6)        *ファイル名を展開する
  101.     pea.l    arg1(a6)        *
  102.     DOS    _NAMECK            *
  103.     addq.l    #8,sp            *
  104.  
  105.     tst.l    d0            *d0<0なら
  106.     bmi    name_er            * ファイル名の指定に誤りがある
  107.  
  108.     beq    nowild            *d0=0ならワイルドカード指定なし
  109.  
  110.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  111.     bne    wild            * ワイルドカード指定あり
  112.  
  113. noname:                    *ファイル名が指定されていない場合
  114.     lea.l    arg1(a6),a0        *バッファargに
  115.     lea.l    nambuf(a6),a1        * nameckで展開したパス名+'*.BMP'
  116.     bsr    strcpy            * を再構成する
  117.     lea.l    kome0(pc),a1        *
  118.     bsr    strcpy            *
  119.  
  120. wild:                    *ワイルドカードが指定された場合
  121.                     *何もしなくてよい
  122. cknam0:
  123.     rts
  124.  
  125. nowild:                    *ワイルドカードが指定されていない場合
  126.     move.w    #SUBDIR,-(sp)        *サブディレクトリであると仮定して
  127.     pea.l    arg1(a6)        * 検索してみる
  128.     pea.l    filbuf(a6)        *
  129.     DOS    _FILES            *
  130.     lea.l    10(sp),sp        *
  131.     
  132.     tst.l    d0            *見つかったか?
  133.     bmi    cknam0            * 見つからなければファイルだろう
  134.  
  135.     lea.l    arg1(a6),a0        *バッファarg1に
  136.     lea.l    komekome(pc),a1        * もとのファイル名+'\*.BMP'
  137.     bsr    strcat            * を再構成する
  138.  
  139.     bra    chkname            *nameckでファイル名を展開するために
  140.                     * サブルーチン先頭に戻る
  141.  
  142. *****************************************************************
  143. *    出力パス名をチェックする                *
  144. *****************************************************************
  145. s_name_chk:
  146.     lea.l    arg2(a6),a0        *出力パス名を指定したか?
  147.     tst.b    (a0)
  148.     beq    s_name_chk8        *してない
  149.  
  150.     pea.l    nambuf(a6)        *ファイル名を展開する
  151.     pea.l    arg2(a6)        *
  152.     DOS    _NAMECK            *
  153.     addq.l    #8,sp            *
  154.  
  155.     tst.l    d0            *d0<0なら
  156.     bmi    out_name_err        * パス名の指定に誤りがある
  157.  
  158.     beq    s_name_chk1        *d0=0ならワイルドカード指定なし
  159.  
  160.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  161.     bne    out_name_err        * ワイルドカード指定あり
  162.  
  163. s_name_chk1:
  164.     lea.l    arg2(a6),a0        *ドライブ名を指定しているか?
  165.     cmp.b    #':',1(a0)
  166.     bne    out_name_err        *ドライブ名の指定に誤りがある
  167.  
  168.     tst.b    2(a0)            *ドライブ名のみか
  169.     bne    s_name_chk2        *違う
  170.     addq.l    #2,a0
  171.     bra    s_name_chk9
  172.  
  173. s_name_chk2:
  174.     moveq.l    #0,d0            *セーブ先ドライブ番号を求める
  175.     move.b    (a0),d0
  176.     bsr    toupper
  177.     sub.b    #'A',d0
  178.     add.b    #1,d0
  179.  
  180.     lea.l    spathbuf(a6),a1        *セーブ先ドライブ名
  181.     move.b    (a0),(a1)+
  182.     move.b    #':',(a1)+
  183.     move.b    #'\',(a1)+
  184.  
  185.     move.l    a1,-(sp)        *セーブ先パスをセーブ
  186.     move.w    d0,-(sp)
  187.     DOS    _CURDIR
  188.     addq.l    #6,sp
  189.  
  190.     lea.l    cpathbuf(a6),a2        *カレントパスをセーブしておく
  191.     DOS    _CURDRV
  192.     add.b    #"A",d0
  193.     move.b    d0,(a2)+
  194.     move.b    #':',(a2)+
  195.     move.b    #'\',(a2)+
  196.  
  197.     move.l    a2,-(sp)
  198.     move.w    #0,-(sp)
  199.     DOS    _CURDIR
  200.     addq.l    #6,sp
  201.  
  202.     pea.l    arg2(a6)        *コマンドラインで指定されたパスへ
  203.     DOS    _CHDIR            * 移動してみる
  204.     addq.l    #4,sp
  205.  
  206.     tst.l    d0            *d0が0でなければ
  207.     bmi    out_name_err        * パス名の指定に誤りがある
  208.  
  209.     pea.l    spathbuf(a6)        *セーブ先パスを戻す
  210.     DOS    _CHDIR
  211.     addq.l    #4,sp
  212.  
  213.     pea.l    cpathbuf(a6)        *カレントパスに戻す
  214.     DOS    _CHDIR
  215.     addq.l    #4,sp
  216.  
  217.     lea.l    arg2(a6),a0        *
  218.     bsr    set_en            *パス名の最後に\マークをセット
  219.     bra    s_name_chk9
  220.  
  221. s_name_chk8:
  222.     lea.l    arg2(a6),a0
  223.  
  224. s_name_chk9:
  225.     move.l    a0,nameichi(a6)
  226.     rts
  227.  
  228. *****************************************************************
  229. *    パス名に¥マークを連結する                *
  230. *****************************************************************
  231. set_en:
  232.     tst.b    (a0)+            *(a0)は0か?
  233.     bne    set_en            *そうでなければ繰り返す
  234.     subq.l    #1,a0            *行きすぎたから1つ戻る
  235.  
  236.     cmp.b    #"\",-1(a0)        *一番最後の文字が¥か
  237.     beq    set_en_            * ¥ならばスキップ
  238.     move.b    #'\',(a0)+        * ¥をセット
  239. set_en_:
  240.     rts
  241.  
  242. *****************************************************************
  243. *    files,nfilesで見付けたファイル名をフルパスに構成し直し    *
  244. *        arg1以降に格納する                *
  245. *****************************************************************
  246. setpath:
  247.     lea.l    arg1(a6),a0        *a0=コピー先
  248.     lea.l    nambuf(a6),a1        *a1=nameckで展開したパス名
  249.     bsr    strcpy            *コピーする
  250.     lea.l    filbuf(a6),a1        *a1=files,nfilesで見付けたファイル名
  251.     lea.l    30(a1),a1
  252.     bsr    strcpy            *連結する
  253.     rts
  254.  
  255. *****************************************************************
  256. *    文字列の連結および複写                    *
  257. *    リターン時a0は文字列末の00Hを指す            *
  258. *****************************************************************
  259. strcat:
  260.     tst.b    (a0)+            *(a0)は0か?
  261.     bne    strcat            *そうでなければ繰り返す
  262.     subq.l    #1,a0            *行きすぎたから1つ戻る
  263. strcpy:
  264.     move.b    (a1)+,(a0)+        *1文字ずつ
  265.     bne    strcpy            *終了コードまでを転送する
  266.     subq.l    #1,a0            *a0は進み過ぎている
  267.                     *a0は文字列末の00Hを指す
  268.     rts
  269.  
  270. *****************************************************************
  271. *    拡張子を補う                        *
  272. *****************************************************************
  273. chkext:
  274.     lea.l    arg1(a6),a0        *ファイル名のアドレス
  275.     lea.l    dext(pc),a1        *拡張子のアドレス
  276. chkext0:
  277.     cmp.b    #".",(a0)        *拡張子があるか
  278.     beq    chkext2
  279.     tst.b    (a0)+            *(a0)は0か?
  280.     bne    chkext0            *そうでなければ繰り返す
  281.     subq.l    #1,a0            *行きすぎたから1つ戻る
  282. chkext1:
  283.     move.b    (a1)+,(a0)+        *1文字転送
  284.     bne    chkext1            *終了コードまで繰り返す
  285. chkext2:
  286.     rts
  287.  
  288. *****************************************************************
  289. *    コマンドラインのチェックを行う                *
  290. *****************************************************************
  291. cmdchk:
  292.     lea.l    arg1(a6),a0        *a0=引数切り出し領域
  293.     clr.b    256(a0)            *出力ファイル名をちょっと初期化
  294.     addq.l    #1,a2            *a2=コマンドライン文字列先頭
  295.     sf    dflg(a6)        *DスイッチOFF
  296.     sf    nflg(a6)        *NスイッチOFF
  297.     sf    hflg(a6)        *HスイッチOFF
  298.  
  299. cmdchk0:
  300.     bsr    switch_chk        *スイッチのチェック
  301.  
  302.     tst.b    (a2)            *引数があるか?
  303.     beq    usage            *ないならファイル名が足りない
  304.     bsr    getarg            *ファイル名切り出し
  305.     lea.l    256(a0),a0        *a0=a0+256
  306.     bsr    switch_chk        *さらにスイッチのチェック
  307.     bsr    getarg            *ファイル名切り出し
  308.     bsr    switch_chk        *さらにスイッチのチェック
  309.     tst.b    (a2)            *引数があるか?
  310.     bne    usage            * あるなら引数が多い
  311. cmdchk1:
  312.     rts
  313.  
  314. *****************************************************************
  315. *    スペースを飛ばしつぎの引数先頭までポインタを進め    *
  316. *    スイッチがあれば処理してしまう                *
  317. *****************************************************************
  318. switch_chk:
  319.     bsr    skipsp            *スペースをスキップする
  320.     tst.b    (a2)            *まだスイッチがあるか?
  321.     beq    switch_chk2        *ないなら戻る(処理の振り分けを行う)
  322.  
  323.     cmpi.b    #'/',(a2)        *引数の先頭が
  324.     beq    switch_chk1        */,-であれば
  325.     cmpi.b    #'-',(a2)        *  スイッチ
  326.     beq    switch_chk1        *
  327.     bra    switch_chk2        *スイッチでないなら戻る
  328.  
  329. switch_chk1:
  330.     addq.l    #1,a2            *'/'や'-'の分ポインタを進める
  331.     tst.b    (a2)            *スイッチがあるか?
  332.     beq    usage            * ないなら使用方表示
  333.     move.b    (a2)+,d0        *1文字取り出す
  334.     bsr    toupper            *大文字に変換しておく
  335.  
  336.     cmpi.b    #'D',d0            *Dスイッチ?
  337.     beq    dsw            * そうなら分岐
  338.     cmpi.b    #'N',d0
  339.     beq    nsw
  340.     cmpi.b    #'H',d0
  341.     beq    hsw
  342.     bra    usage            *無効なスイッチが指定された
  343.  
  344. dsw:
  345.     tst.b    dflg(a6)        *スイッチの二重指定チェック
  346.     bne    usage
  347.     st    dflg(a6)        *DスイッチON
  348.     bra    switch_chk        *まだスイッチがあるかもしれない
  349.  
  350. nsw:
  351.     tst.b    nflg(a6)
  352.     bne    usage
  353.     st    nflg(a6)
  354.     bra    switch_chk
  355.  
  356. hsw:
  357.     tst.b    hflg(a6)
  358.     bne    usage
  359.     st    hflg(a6)
  360.     bra    switch_chk
  361.  
  362. switch_chk2:
  363.     rts
  364.  
  365. *****************************************************************
  366. *    ファイル名を切り出す                    *
  367. *****************************************************************
  368. getarg:
  369.     move.l    a0,-(sp)        *{レジスタ待避
  370. gtarg0:    tst.b    (a2)            *1)文字列の終端コードか
  371.     beq    gtarg1            *
  372.     cmpi.b    #SPACE,(a2)        *2)スペースか
  373.     beq    gtarg1            *
  374.     cmpi.b    #TAB,(a2)        *3)タブか
  375.     beq    gtarg1            *
  376. *    cmpi.b    #'-',(a2)        *4)ハイフンか
  377. *    beq    gtarg1            *
  378.     cmpi.b    #'/',(a2)        *5)スラッシュ
  379.     beq    gtarg1            *
  380.     move.b    (a2)+,(a0)+        * が現れるまで転送を
  381.     bra    gtarg0            * 繰り返す
  382. gtarg1:    clr.b    (a0)            *文字列終端コードを書き込む
  383.     movea.l    (sp)+,a0        *}レジスタ復帰
  384.     rts
  385.  
  386. *****************************************************************
  387. *    スペース・TABをスキップする                *
  388. *****************************************************************
  389. skipsp0:
  390.     addq.l    #1,a2
  391. skipsp:
  392.     cmpi.b    #$20,(a2)
  393.     beq    skipsp0
  394.     cmpi.b    #$09,(a2)
  395.     beq    skipsp0
  396.     rts
  397.  
  398. *****************************************************************
  399. *    小文字→大文字変換ルーチン                *
  400. *****************************************************************
  401. toupper:
  402.     cmpi.b    #'a',d0
  403.     bcs    toupr0
  404.     cmpi.b    #'z'+1,d0
  405.     bcc    toupr0
  406.     subi.b    #$20,d0
  407. toupr0:
  408.     rts
  409.  
  410. *****************************************************************
  411. *    メイン処理                        *
  412. *****************************************************************
  413. main:
  414.     clr.w    line_cnt(a6)        *ラインカウント初期化
  415.     sf    skip_flg(a6)        *スキップフラグ初期化
  416.     lea.l    arg1(a6),a0        *ファイル名セット
  417.     bsr    file_open        *ファイルオープン
  418.     bsr    file_size        *ファイルサイズを調べる
  419.     move.l    d6,fi_size(a6)
  420.  
  421.     movea.l    buff_addr(a6),a5    *ヘッダを読み込む
  422.     moveq.l    #14+64,d6
  423.     bsr    file_read
  424.  
  425.     bsr    file_chk        *コンバートできるか調べる
  426.     tst.b    skip_flg(a6)
  427.     bne    main9
  428.  
  429.     bsr    line_byte_set        *1ラインのバイト数を調べる
  430.     bsr    mem_chk            *メモリが足りるか調べる
  431.     tst.b    skip_flg(a6)
  432.     bne    main9
  433.  
  434.     bsr    pal_set            *パレットデータ作成
  435.     bsr    convert            *コンバート
  436.  
  437.     addq.w    #1,file_cnt(a6)
  438. main9:
  439.     bsr    file_close1
  440.     rts
  441.  
  442. *****************************************************************
  443. *    ファイルヘッダから画像サイズを求める            *
  444. *****************************************************************
  445. file_chk:
  446.     movea.l    buff_addr(a6),a0    *読み込んだデータの先頭
  447.  
  448.     tst.b    hflg(a6)
  449.     bne    file_chk1
  450.     cmp.w    #'BM',f_type(a0)    *ファイル識別子はあっているか
  451.     beq    file_chk1
  452.     bsr    file_er            *BMPファイルではない
  453.     bra    file_chk9
  454.  
  455. file_chk1:
  456.     move.l    f_offbits(a0),d0    *offbitsセーブ
  457.     bsr    i_to_m
  458.     move.l    d0,offbits(a6)
  459.  
  460. *    move.l    f_size(a0),d0        *ファイルサイズセーブ
  461. *    bsr    i_to_m
  462. *    move.l    d6,fi_size(a6)
  463.  
  464.     move.l    win3_size(a0),d0    *BMPの種類
  465.     bsr    i_to_m
  466.     move.w    d0,os_type(a6)
  467.  
  468.     cmp.w    #OS2v1,d0        *OS/2 1.x
  469.     beq    os21_chk
  470.     cmp.w    #WIN3,d0        *Win 3.x
  471.     beq    win3_chk
  472.     cmp.w    #OS2v2,d0        *OS/2 2.x(Win3チェックで動くと思う)
  473.     beq    win3_chk
  474.     bsr    no_support_err
  475.     bra    file_chk9
  476.  
  477. *****************************************************************
  478. *    OS/2 1.xのサイズを求める                *
  479. *****************************************************************
  480. os21_chk:
  481.     move.w    os21_planes(a0),d0    *使用プレーン数は1か
  482.     ror.w    #8,d0
  483.     cmp.w    #1,d0
  484.     beq    os21_chk0
  485.     bsr    no_support_err
  486.     bra    file_chk9
  487.  
  488. os21_chk0:
  489.     move.w    os21_bitcount(a0),d0    *使用色数GET
  490.     ror.w    #8,d0
  491.     move.w    d0,iro(a6)
  492.  
  493.     cmp.w    #1,d0            *2
  494.     beq    os21_chk1
  495.     cmp.w    #4,d0            *16
  496.     beq    os21_chk1
  497.     cmp.w    #8,d0            *256
  498.     beq    os21_chk1
  499.     cmp.w    #24,d0            *Full
  500.     beq    os21_chk1
  501.     bsr    but_col_err        *それ以外は無視*
  502.     bra    file_chk9
  503.  
  504. os21_chk1:
  505.     move.w    os21_width(a0),d0    *横ドット数求める
  506.     ror.w    #8,d0
  507.     move.w    d0,yoko(a6)
  508.     move.w    os21_height(a0),d0    *縦ドット数求める
  509.     ror.w    #8,d0
  510.     move.w    d0,tate(a6)
  511.  
  512.     cmp.w    #24,iro(a6)
  513.     beq    os21_chk2
  514.  
  515.     move.l    os21_size(a0),d0    *パレット数を求める
  516.     bsr    i_to_m
  517.     move.l    offbits(a6),d1
  518.     sub.l    d0,d1
  519.     sub.l    #14,d1
  520.     divu.w    #3,d1            *おそい
  521.     move.w    d1,pal_cnt(a6)
  522.  
  523.     move.l    a0,a1            *パレットデータのアドレス
  524.     adda.l    d0,a1
  525.     adda.l    #14,a1
  526.     move.l    a1,pal_addr(a6)
  527.  
  528. os21_chk2:
  529.     move.l    buff_addr(a6),gr_addr(a6)    *変換後画像アドレス
  530.     clr.w    compress(a6)
  531.     rts
  532.  
  533. *****************************************************************
  534. *    WIN3.xのサイズを求める                    *
  535. *****************************************************************
  536. win3_chk:
  537.     move.w    win3_planes(a0),d0    *使用プレーン数は1か
  538.     ror.w    #8,d0
  539.     cmp.w    #1,d0
  540.     beq    win3_chk1
  541.     bsr    no_support_err
  542.     bra    file_chk9
  543.  
  544. win3_chk1:
  545.     move.w    win3_bitcount(a0),d0    *使用色数GET
  546.     ror.w    #8,d0
  547.     move.w    d0,iro(a6)
  548.  
  549.     cmp.w    #1,d0            *2
  550.     beq    win3_chk2
  551.     cmp.w    #4,d0            *16
  552.     beq    win3_chk2
  553.     cmp.w    #8,d0            *256
  554.     beq    win3_chk2
  555.     cmp.w    #16,d0            *32k
  556.     beq    win3_chk2
  557.     cmp.w    #24,d0            *Full
  558.     beq    win3_chk2
  559.     bsr    but_col_err        *それ以外は無視*
  560.     bra    file_chk9
  561.  
  562. win3_chk2:
  563.     move.l    win3_comp(a0),d0    *圧縮モード
  564.     bsr    i_to_m
  565.     move.w    d0,compress(a6)
  566.  
  567.     move.l    win3_width(a0),d0    *横ドット数求める
  568.     bsr    i_to_m
  569.     move.w    d0,yoko(a6)
  570.     move.l    win3_height(a0),d0    *縦ドット数求める
  571.     bsr    i_to_m
  572.     move.w    d0,tate(a6)
  573.  
  574.     cmp.w    #24,iro(a6)        *フルカラーの時
  575.     beq    win3_chk3
  576.  
  577.     move.l    win3_size(a0),d0    *パレット数を求める
  578.     bsr    i_to_m
  579.     move.l    offbits(a6),d1
  580.     sub.l    d0,d1
  581.     sub.l    #14,d1
  582.     lsr.l    #2,d1
  583.     move.w    d1,pal_cnt(a6)
  584.  
  585.     movea.l    a0,a1        *パレットの先頭アドレスを求める
  586.     adda.l    d0,a1
  587.     adda.l    #14,a1
  588.     move.l    a1,pal_addr(a6)
  589.  
  590. win3_chk3:
  591.     move.l    buff_addr(a6),gr_addr(a6)    *変換後画像アドレス
  592.     rts
  593.  
  594. file_chk9:                *スキップする画像の時
  595.     bsr    file_close1
  596.     st    skip_flg(a6)
  597.     rts
  598.  
  599. *****************************************************************
  600. *    メモリチェック                        *
  601. *****************************************************************
  602. mem_chk:
  603.     cmp.w    #16,iro(a6)        *16bitBMP
  604.     beq    mem_chk2
  605.  
  606.     tst.w    compress(a6)
  607.     bne    mem_chk1        *rle4 or 8
  608.  
  609. mem_chk0:
  610.     moveq.l    #0,d0            *ベタは最低1ライン
  611.     move.w    line_byte1(a6),d0
  612.     add.w    line_byte2(a6),d0
  613.     bra    mem_chk3
  614.  
  615. mem_chk1:
  616.     move.w    line_byte1(a6),d0    *RLE圧縮はオンメモリ
  617.     add.w    line_byte2(a6),d0
  618.     mulu.w    tate(a6),d0
  619.  
  620.     move.w    line_byte2(a6),d1
  621.     mulu.w    tate(a6),d1
  622.     add.l    fi_size(a6),d1
  623.  
  624.     cmp.l    d0,d1
  625.     bls    mem_chk1_
  626.     move.l    d1,d0
  627. mem_chk1_:
  628.     bra    mem_chk3
  629.  
  630. mem_chk2:
  631.     move.w    line_byte1(a6),d0    *16bitBMPもオンメモリ
  632.     add.w    line_byte2(a6),d0
  633.     mulu.w    tate(a6),d0
  634.     add.l    fi_size(a6),d0
  635.  
  636. mem_chk3:
  637.     cmp.l    buff_size(a6),d0
  638.     bls    mem_chk4
  639.     bsr    no_buff
  640.     bsr    file_close1
  641.     st    skip_flg(a6)
  642. mem_chk4:
  643.     rts
  644.  
  645. i_to_m:
  646.     ror.w    #8,d0
  647.     swap.w    d0
  648.     ror.w    #8,d0
  649.     rts
  650.  
  651. *****************************************************************
  652. *    1ラインのバイト数を求める                *
  653. *****************************************************************
  654. line_byte_set:
  655.     move.w    iro(a6),d0
  656.     cmp.w    #4,d0
  657.     bcs    lb_set1
  658.     beq    lb_set4
  659.  
  660.     cmp.w    #16,d0
  661.     bcs    lb_set8
  662.     beq    lb_set16
  663.     bhi    lb_set24
  664.  
  665. lb_set1:
  666.     move.w    yoko(a6),d0
  667.     add.w    #31,d0
  668.     lsr.w    #3,d0
  669.     and.w    #$fffc,d0
  670.     move.w    d0,line_byte1(a6)
  671.     bra    line_byte_set9
  672.  
  673. lb_set4:
  674.     move.w    yoko(a6),d0
  675.     addq.w    #7,d0
  676.     lsr.w    #1,d0
  677.     and.w    #$fffc,d0
  678.     move.w    d0,line_byte1(a6)
  679.     bra    line_byte_set9
  680.  
  681. lb_set8:
  682.     move.w    yoko(a6),d0
  683.     addq.w    #3,d0
  684.     andi.w    #$fffc,d0
  685.     move.w    d0,line_byte1(a6)
  686.     bra    line_byte_set9
  687.  
  688. lb_set16:
  689.     move.w    yoko(a6),d0
  690.     add.w    d0,d0
  691.     addq.w    #3,d0
  692.     and.w    #$fffc,d0
  693.     move.w    d0,line_byte1(a6)
  694.     bra    line_byte_set9
  695.  
  696. lb_set24:
  697.     move.w    yoko(a6),d0
  698.     move.w    d0,d1
  699.     add.w    d1,d1
  700.     add.w    d1,d0
  701.     addq.w    #3,d0
  702.     and.w    #$fffc,d0
  703.     move.w    d0,line_byte1(a6)
  704.  
  705. line_byte_set9:
  706.     move.w    yoko(a6),d0
  707.     add.w    d0,d0
  708.     move.w    d0,line_byte2(a6)
  709.     rts
  710.  
  711. *****************************************************************
  712. *    コンバート                        *
  713. *****************************************************************
  714. convert:
  715.     tst.w    compress(a6)        *圧縮ファイルは展開する
  716.     beq    convert0
  717.     bsr    tenkai
  718.  
  719. convert0:
  720.     bsr    prt0
  721.     bsr    prt1
  722.  
  723.     bsr    save_name_set        *書き込むファイル名作成
  724.  
  725.     lea.l    arg2(a6),a0        *ファイル作成
  726.     bsr    file_create
  727.  
  728.     move.w    tate(a6),d0        *ヘッダ設定&書き込み
  729.     ror.w    #8,d0
  730.     move.w    d0,-(sp)
  731.     move.w    yoko(a6),d0
  732.     ror.w    #8,d0
  733.     move.w    d0,-(sp)
  734.     movea.l    sp,a5
  735.     moveq.l    #4,d6
  736.     bsr    file_write
  737.     addq.l    #4,sp
  738.  
  739.     move.w    line_byte1(a6),d0    *一回に変換できるライン数(d3)を求める
  740.     add.w    line_byte2(a6),d0
  741.     move.l    buff_size(a6),d3
  742.     divu.w    d0,d3
  743.  
  744.     cmp.w    tate(a6),d3        *一回で変換できるか
  745.     bls    convert1        *できない
  746.  
  747.     move.w    tate(a6),d3
  748.     moveq.l    #1,d4
  749.     moveq.l    #0,d5
  750.     bra    convert2
  751.  
  752. convert1:
  753.     moveq.l    #0,d5            *繰り返し数(d4)と残り(d5)を求める
  754.     move.w    tate(a6),d5
  755.     divu.w    d3,d5
  756.     move.w    d5,d4
  757.     swap    d5
  758.  
  759. convert2:
  760.     move.w    line_byte1(a6),d0    *変換先アドレスを求める
  761.     mulu.w    d3,d0
  762.     add.l    buff_addr(a6),d0
  763.     move.l    d0,gr_addr(a6)
  764.  
  765.     bsr    convert4
  766.  
  767.     tst.w    d5            *半端分があるか
  768.     beq    convert3        *ない
  769.     moveq.l    #1,d4            *最後のコンバート
  770.     move.w    d5,d3
  771.     bsr    convert4
  772.  
  773. convert3:
  774.     move.w    out_file(a6),-(sp)    *ファイルCLOSE
  775.     DOS    _CLOSE
  776.     addq.l    #2,sp
  777.     bsr    prt3
  778.     rts
  779.  
  780. convert4:
  781.     subq.w    #1,d4
  782. convert4_:
  783.     tst.w    compress(a6)
  784.     bne    convert5
  785.  
  786.     bsr    get_seek        *シーク位置(d0)求める
  787.     bsr    file_seek
  788.  
  789.     movea.l    buff_addr(a6),a5    *読み込み
  790.     move.w    line_byte1(a6),d6
  791.     mulu.w    d3,d6
  792.     bsr    file_read
  793.  
  794. convert5:
  795.     move.w    d3,d7            *コンバート
  796.     bsr    gr_conv
  797.  
  798.     move.l    gr_addr(a6),a5        *書き込み
  799.     move.w    line_byte2(a6),d6
  800.     mulu.w    d3,d6
  801.     bsr    file_write
  802.  
  803.     dbra.w    d4,convert4_        *繰り返し
  804.     rts
  805.  
  806. get_seek:                *シーク位置(d0)求める
  807.     move.w    tate(a6),d0
  808.     move.w    line_cnt(a6),d1
  809.     add.w    d3,d1
  810.     sub.w    d1,d0
  811.     mulu.w    line_byte1(a6),d0
  812.     add.l    offbits(a6),d0
  813.     rts
  814.  
  815. file_seek:                *指定位置(d0)にシーク
  816.     move.w    #0,-(sp)        *シークモード
  817.     move.l    d0,-(sp)        *オフセット
  818.     move.w    in_file(a6),-(sp)
  819.     DOS    _SEEK
  820.     addq.l    #8,sp
  821.     tst.l    d0
  822.     bmi    read_err
  823.     rts
  824.  
  825. *****************************************************************
  826. *    画像コンバート                        *
  827. *****************************************************************
  828. gr_conv:
  829.     subq.w    #1,d7            *繰り返し数
  830.     move.l    buff_addr(a6),a0    *変換元
  831.     move.w    d7,d0
  832.     mulu.w    line_byte1(a6),d0
  833.     add.l    d0,a0
  834.     move.l    gr_addr(a6),a2        *変換先
  835.  
  836.     move.w    iro(a6),d0
  837.     cmp.w    #4,d0
  838.     bcs    bit1_conv
  839.     beq    bit4_conv
  840.  
  841.     cmp.w    #16,d0
  842.     bcs    bit8_conv
  843.     beq    bit16_conv
  844.     bhi    bit24_conv
  845.  
  846. *****************************************************************
  847. *    1bit画像をコンバート                    *
  848. *****************************************************************
  849. bit1_conv:
  850.     movem.l    d0-d1/d3-d4/d6-d7/a0-a4,-(sp)
  851.  
  852.     move.w    yoko(a6),d0        *横サイズ
  853.     move.w    d0,d6            *端数を計算
  854.     andi.w    #$0007,d6
  855.  
  856.     lea.l    dpal_buf(a6),a3
  857.     movea.w    line_byte1(a6),a4
  858.  
  859.     lsr.w    #3,d0            *横/8-1
  860.     subq.w    #1,d0
  861. bit1_conv2:
  862.     move.w    d0,d1            *横ループ
  863.     movea.l    a0,a1
  864. bit1_conv3:
  865.     move.b    (a1)+,d3
  866.  
  867.     moveq.l    #0,d4
  868.     add.b    d3,d3
  869.     addx.b    d4,d4
  870.     add.b    d4,d4
  871.     move.w    0(a3,d4.w),(a2)+
  872.     moveq.l    #0,d4
  873.     add.b    d3,d3
  874.     addx.b    d4,d4
  875.     add.b    d4,d4
  876.     move.w    0(a3,d4.w),(a2)+
  877.     moveq.l    #0,d4
  878.     add.b    d3,d3
  879.     addx.b    d4,d4
  880.     add.b    d4,d4
  881.     move.w    0(a3,d4.w),(a2)+
  882.     moveq.l    #0,d4
  883.     add.b    d3,d3
  884.     addx.b    d4,d4
  885.     add.b    d4,d4
  886.     move.w    0(a3,d4.w),(a2)+
  887.     moveq.l    #0,d4
  888.     add.b    d3,d3
  889.     addx.b    d4,d4
  890.     add.b    d4,d4
  891.     move.w    0(a3,d4.w),(a2)+
  892.     moveq.l    #0,d4
  893.     add.b    d3,d3
  894.     addx.b    d4,d4
  895.     add.b    d4,d4
  896.     move.w    0(a3,d4.w),(a2)+
  897.     moveq.l    #0,d4
  898.     add.b    d3,d3
  899.     addx.b    d4,d4
  900.     add.b    d4,d4
  901.     move.w    0(a3,d4.w),(a2)+
  902.     moveq.l    #0,d4
  903.     add.b    d3,d3
  904.     addx.b    d4,d4
  905.     add.b    d4,d4
  906.     move.w    0(a3,d4.w),(a2)+
  907.     dbra.w    d1,bit1_conv3
  908.  
  909.     move.w    d6,d1            *端数があるか
  910.     beq    bit1_conv5        *ない
  911.     subq.w    #1,d1
  912.     move.b    (a1)+,d3
  913. bit1_conv4:
  914.     moveq.l    #0,d4
  915.     add.b    d3,d3
  916.     addx.b    d4,d4
  917.     add.b    d4,d4
  918.     move.w    0(a3,d4.w),(a2)+
  919.     dbra.w    d1,bit1_conv4
  920.  
  921. bit1_conv5:
  922.     bsr    prt2            *変換ライン数表示
  923.     suba.l    a4,a0            *変換元アドレス更新
  924.     dbra.w    d7,bit1_conv2
  925.     movem.l    (sp)+,d0-d1/d3-d4/d6-d7/a0-a4
  926.     rts
  927.  
  928. *****************************************************************
  929. *    4bit画像をコンバート                    *
  930. *****************************************************************
  931. bit4_conv:
  932.     movem.l    d0-d4/d7/a0-a4,-(sp)
  933.  
  934.     lea.l    dpal_buf(a6),a3
  935.     movea.w    line_byte1(a6),a4
  936.     move.w    #$000f,d4
  937.  
  938.     move.w    yoko(a6),d0
  939.     btst.l    #0,d0            *横ドットが奇数か?
  940.     bne    bit4_conv4        *そう
  941.  
  942.     lsr.w    #1,d0            *横/2-1
  943.     subq.w    #1,d0
  944. bit4_conv2:                *横ドット=偶数
  945.     move.w    d0,d1
  946.     movea.l    a0,a1
  947. bit4_conv3
  948.     move.b    (a1)+,d2
  949.     move.b    d2,d3
  950.  
  951.     lsr.b    #4,d2            *上位4ビットを変換
  952.     and.w    d4,d2
  953.     add.w    d2,d2
  954.     move.w    0(a3,d2.w),(a2)+
  955.  
  956.     and.w    d4,d3            *下位4ビットを変換
  957.     add.w    d3,d3
  958.     move.w    0(a3,d3.w),(a2)+
  959.  
  960.     dbra.w    d1,bit4_conv3
  961.  
  962.     bsr    prt2            *変換ライン数表示
  963.     suba.l    a4,a0
  964.     dbra.w    d7,bit4_conv2
  965.     movem.l    (sp)+,d0-d4/d7/a0-a4
  966.     rts
  967.  
  968.  
  969. bit4_conv4:                *横ドット数=奇数
  970.     lsr.w    #1,d0            *横/2-1
  971.     subq.w    #1,d0
  972. bit4_conv5
  973.     move.w    d0,d1
  974.     movea.l    a0,a1
  975. bit4_conv6
  976.     move.b    (a1)+,d2
  977.     move.b    d2,d3
  978.  
  979.     lsr.b    #4,d2            *上位4ビットを変換
  980.     and.w    d4,d2
  981.     add.w    d2,d2
  982.     move.w    0(a3,d2.w),(a2)+
  983.  
  984.     and.w    d4,d3            *下位4ビットを変換
  985.     add.w    d3,d3
  986.     move.w    0(a3,d3.w),(a2)+
  987.  
  988.     dbra.w    d1,bit4_conv6
  989.  
  990.     move.b    (a1)+,d2        *上位4ビットのみ変換
  991.     lsr.b    #4,d2
  992.     and.w    d4,d2
  993.     add.w    d2,d2
  994.     move.w    0(a3,d2.w),(a2)+
  995.  
  996.     bsr    prt2            *変換ライン数表示
  997.     suba.l    a4,a0
  998.     dbra.w    d7,bit4_conv5
  999.     movem.l    (sp)+,d0-d4/d7/a0-a4
  1000.     rts
  1001.  
  1002. *****************************************************************
  1003. *    8bit画像をコンバート                    *
  1004. *****************************************************************
  1005. bit8_conv:
  1006.     tst.b    dflg(a6)
  1007.     bne    bit8_conv5
  1008.  
  1009. bit8_conv0:                *ノーマル
  1010.     movem.l    d0-d1/d5-d7/a0-a4,-(sp)
  1011.     move.w    line_byte1(a6),a4
  1012.     move.w    yoko(a6),d5
  1013.     subq.w    #1,d5
  1014.     lea.l    dpal_buf(a6),a3
  1015. bit8_conv1:
  1016.     movea.l    a0,a1
  1017.     move.w    d5,d6
  1018. bit8_conv2:
  1019.     moveq.l    #0,d1
  1020.     move.b    (a1)+,d1
  1021.     add.w    d1,d1
  1022.     move.w    0(a3,d1.w),(a2)+
  1023.     dbra.w    d6,bit8_conv2
  1024.     bsr    prt2            *変換ライン数表示
  1025.     suba.l    a4,a0
  1026.     dbra.w    d7,bit8_conv1
  1027.     movem.l    (sp)+,d0-d1/d5-d7/a0-a4
  1028.     rts
  1029.  
  1030. bit8_conv5:                *ディザ
  1031.     movem.l    d0-d7/a0-a5,-(sp)
  1032.     move.w    yoko(a6),d5
  1033.     subq.w    #1,d5
  1034.  
  1035.     lea.l    dpal_buf(a6),a3
  1036.     moveq.l    #0,d2
  1037.     move.w    #512,d3
  1038.     move.w    #$07ff,d4
  1039.     move.w    #2048,a5
  1040.  
  1041. bit8_conv6:
  1042.     movea.l    a0,a1
  1043.     lea.l    (a3,d2.w),a4
  1044.     move.w    d5,d6
  1045.     moveq.l    #0,d0
  1046.  
  1047. bit8_conv7:
  1048.     moveq.l    #0,d1
  1049.     move.b    (a1)+,d1
  1050.     add.w    d1,d1
  1051.     add.w    d0,d1
  1052.     move.w    0(a4,d1.w),(a2)+
  1053.     add.w    d3,d0
  1054.     and.w    d4,d0
  1055.     dbra.w    d6,bit8_conv7
  1056.  
  1057.     suba.w    line_byte1(a6),a0
  1058.     bsr    prt2            *変換ライン数表示
  1059.     add.w    a5,d2
  1060.     andi.w    #$1fff,d2
  1061.     dbra.w    d7,bit8_conv6
  1062.     movem.l    (sp)+,d0-d7/a0-a5
  1063.     rts
  1064.  
  1065. *****************************************************************
  1066. *    16bit画像をコンバート                    *
  1067. *****************************************************************
  1068. bit16_conv:
  1069.     bsr    irohen16        *変換
  1070.     tst.b    nflg(a6)
  1071.     beq    bit16_conv9
  1072.     bsr    hanten            *画像の上下反転
  1073. bit16_conv9:
  1074.     rts
  1075.  
  1076. irohen16:
  1077.     movem.l    d0-d7/a0-a4,-(sp)
  1078.  
  1079.     move.w    #%0000_0000_0111_1100,d4
  1080.     move.w    #%1110_0000_0000_0011,d5
  1081.     move.w    #%0001_1111_0000_0000,d6
  1082.  
  1083.     move.w    yoko(a6),d0        *横ライン数
  1084.     subq.w    #1,d0
  1085.     movea.w    d0,a3
  1086.  
  1087.     movea.w    line_byte1(a6),a4
  1088.  
  1089. irohen16_1:
  1090.     move.w    a3,d0
  1091.     movea.l    a0,a1
  1092.  
  1093. irohen16_2:
  1094.     move.w    (a1)+,d1
  1095.     move.w    d1,d2
  1096.     move.w    d1,d3
  1097.     and.w    d4,d1            *R
  1098.     and.w    d5,d2            *G
  1099.     and.w    d6,d3            *B
  1100.  
  1101.     rol.w    #4,d1
  1102.     ror.w    #2,d2
  1103.     ror.w    #7,d3
  1104.  
  1105.     or.w    d2,d1            *RGB ->GRB
  1106.     or.w    d3,d1
  1107.     move.w    d1,(a2)+
  1108.     dbra.w    d0,irohen16_2
  1109.     bsr    prt2            *変換ライン数表示
  1110.     suba.l    a4,a0
  1111.     dbra.w    d7,irohen16_1
  1112.     movem.l    (sp)+,d0-d7/a0-a4
  1113.     rts
  1114.  
  1115.  
  1116. hanten:
  1117.     movem.l    d0-d4/a0-a3,-(sp)
  1118.  
  1119.     movea.l    a2,a0            *転送元1
  1120.  
  1121.     move.w    tate(a6),d0        *転送元2 (tate-1)*yoko*2
  1122.     subq.w    #1,d0
  1123.     mulu.w    yoko(a6),d0
  1124.     add.l    d0,d0
  1125.     adda.l    d0,a2
  1126.  
  1127.     moveq.l    #0,d1            *1ライン上への差分 yoko*2
  1128.     move.w    yoko(a6),d1
  1129.     add.w    d1,d1
  1130.  
  1131.     move.w    tate(a6),d2        *縦ループ数
  1132.     lsr.w    #1,d2
  1133.     subq.w    #1,d2
  1134.  
  1135.     move.w    yoko(a6),d4
  1136.     subq.w    #1,d4
  1137. hanten1:
  1138.     move.w    d4,d3
  1139.     movea.l    a2,a3
  1140. hanten2:
  1141.     move.w    (a0),d0
  1142.     move.w    (a3),(a0)+
  1143.     move.w    d0,(a3)+
  1144.     dbra.w    d3,hanten2
  1145.     suba.l    d1,a2
  1146.     dbra.w    d2,hanten1
  1147.     movem.l    (sp)+,d0-d4/a0-a3
  1148.     rts
  1149.  
  1150. *****************************************************************
  1151. *    24bit画像をコンバート                    *
  1152. *****************************************************************
  1153. bit24_conv:
  1154.     movem.l    d0-d7/a0-a2,-(sp)
  1155.  
  1156.     move.w    #$00f8,d5        *マスクデータ
  1157.     move.w    #$f800,d4
  1158.  
  1159.     tst.b    dflg(a6)        *ディザあり?
  1160.     beq    d_nashi            *指定無し
  1161.  
  1162.     lea.l    d_pat(pc),a4
  1163.     moveq.l    #3,d3
  1164.  
  1165. conv24_1:
  1166.     move.w    yoko(a6),d6        *横ループ
  1167.     subq.w    #1,d6
  1168.  
  1169.     move.l    a0,a1
  1170.  
  1171.     move.w    line_cnt(a6),d0
  1172.     and.w    d3,d0
  1173.     add.w    d0,d0
  1174.     add.w    d0,d0
  1175.     lea.l    0(a4,d0.w),a5
  1176.  
  1177. conv24_2
  1178.     move.w    d6,d0
  1179.     and.w    d3,d0
  1180.     move.b    0(a5,d0.w),d0
  1181.  
  1182.     move.b    (a1)+,d1        *B
  1183.     add.b    d0,d1
  1184.     bcc    conv24_2_
  1185.     moveq.l    #31*2,d1
  1186.     bra    conv24_3
  1187. conv24_2_:
  1188.     and.w    d5,d1
  1189.     lsr.b    #2,d1
  1190.  
  1191. conv24_3:
  1192.     move.b    (a1)+,d2        *G
  1193.     add.b    d0,d2
  1194.     bcc    conv24_3_
  1195. *    ori.w    #$f800,d1
  1196.     or.w    d4,d1
  1197.     bra    conv24_4
  1198. conv24_3_:
  1199.     and.w    d5,d2
  1200. *    ror.w    #8,d2
  1201.     move.b    d2,-(sp)        *ror.w    #8,d2の代わり
  1202.     move.w    (sp)+,d2        *
  1203.     clr.b    d2            *
  1204.     or.w    d2,d1
  1205.  
  1206. conv24_4
  1207.     move.b    (a1)+,d2        *R
  1208.     add.b    d0,d2
  1209.     bcc    conv24_4_
  1210.     ori.w    #$07c0,d1
  1211.     bra    conv24_5
  1212. conv24_4_
  1213.     and.w    d5,d2
  1214.     rol.w    #3,d2
  1215.     or.w    d2,d1
  1216.  
  1217. conv24_5
  1218.     move.w    d1,(a2)+
  1219.     dbra.w    d6,conv24_2
  1220.     suba.w    line_byte1(a6),a0
  1221.     bsr    prt2            *変換ライン数表示
  1222.     dbra.w    d7,conv24_1
  1223.     movem.l    (sp)+,d0-d7/a0-a2
  1224.     rts
  1225.  
  1226. d_nashi:                *ディザなし
  1227.     move.w    yoko(a6),d6        *横ループ
  1228.     subq.w    #1,d6
  1229.     move.l    a0,a1
  1230. d_nashi1
  1231.     move.b    (a1)+,d0        *B
  1232.     move.b    (a1)+,d1        *G
  1233.     move.b    (a1)+,d2        *R
  1234.     and.w    d5,d0
  1235.     and.w    d5,d1
  1236.     and.w    d5,d2
  1237.     lsr.w    #2,d0
  1238.     lsl.w    #3,d2
  1239. *    lsl.w    #8,d1
  1240.     move.b    d1,-(sp)        *lsl.w    #8,d1の代わり
  1241.     move.w    (sp)+,d1        *
  1242.     clr.b    d1            *
  1243.     or.w    d1,d0
  1244.     or.w    d2,d0            *GRB
  1245.     move.w    d0,(a2)+
  1246.     dbra.w    d6,d_nashi1
  1247.     bsr    prt2            *変換ライン数表示
  1248.     suba.w    line_byte1(a6),a0
  1249.     dbra.w    d7,d_nashi
  1250.     movem.l    (sp)+,d0-d7/a0-a2
  1251.     rts
  1252.  
  1253. *****************************************************************
  1254. *    展開                            *
  1255. *****************************************************************
  1256. tenkai:
  1257.     cmp.w    #1,compress(a6)
  1258.     beq    tenkai8
  1259. tenkai4:
  1260.     bsr    rle4_tenkai
  1261.     bra    tenkai9
  1262. tenkai8:
  1263.     bsr    rle8_tenkai
  1264. tenkai9:
  1265.     rts
  1266.  
  1267. *****************************************************************
  1268. *    RLE4圧縮の展開                        *
  1269. *****************************************************************
  1270. rle4_tenkai:
  1271.     bsr    compress_read        *圧縮データ読み込む
  1272.  
  1273.     movea.l    a5,a0            *展開元
  1274.     movea.l    a5,a2            *展開元MAX
  1275.     adda.l    d6,a2
  1276.  
  1277.     movea.l    a2,a1            *展開先
  1278.  
  1279.     move.l    a1,d0            *万が一の展開先補正
  1280.     btst.l    #0,d0
  1281.     beq    rle4_tenkai_
  1282.     addq.l    #1,a1
  1283. rle4_tenkai_:
  1284.     movea.l    a1,a3            *取っておく
  1285.     movea.l    a1,a4
  1286.  
  1287.     moveq.l    #0,d2
  1288.     moveq.l    #0,d3
  1289.     moveq.l    #$f,d7
  1290.  
  1291. rle4_tenkai0:
  1292.     cmpa.l    a0,a2
  1293.     bls    rle4_tenkai9
  1294.  
  1295.     moveq.l    #0,d0
  1296.     move.b    (a0)+,d0
  1297.     beq    rle4_tenkai2
  1298.     move.b    (a0)+,d1
  1299.  
  1300.     subq.w    #1,d0
  1301. rle4_tenkai1:
  1302.     rol.b    #4,d1
  1303.     bsr    set
  1304.     dbra.w    d0,rle4_tenkai1
  1305.     bra    rle4_tenkai0
  1306.  
  1307. rle4_tenkai2:
  1308.     moveq.l    #0,d0
  1309.     move.b    (a0)+,d0
  1310.  
  1311.     cmp.b    #1,d0
  1312.     bcs    rle4_tenkai5
  1313.     beq    rle4_tenkai9
  1314. *    cmp.b    #2,d0            *無視
  1315. *    bne    rle4_tenkai2_
  1316. *    addq.l    #2,a0
  1317. *    bra    rle4_tenkai0
  1318.  
  1319. rle4_tenkai2_:
  1320.     btst.l    #0,d0            *偶数か
  1321.     bne    rle4_tenkai4        *違う
  1322.  
  1323. rle4_tenkai3:
  1324.     lsr.w    #1,d0
  1325.     subq.w    #1,d0
  1326.     move.w    d0,d5
  1327. rle4_tenkai3_:
  1328.     move.b    (a0)+,d1
  1329.     rol.b    #4,d1
  1330.     bsr    set
  1331.     rol.b    #4,d1
  1332.     bsr    set
  1333.     dbra.w    d0,rle4_tenkai3_
  1334.     btst.l    #0,d5
  1335.     bne    rle4_tenkai3__
  1336.     addq.l    #1,a0
  1337. rle4_tenkai3__:
  1338.     bra    rle4_tenkai0
  1339.  
  1340. rle4_tenkai4:
  1341.     cmp.w    #1,d0
  1342.     bne    rle4_tenkai4_
  1343.     move.b    (a0)+,d1
  1344.     rol.b    #4,d1
  1345.     bsr    set
  1346.     addq.l    #1,a0
  1347.     bra    rle4_tenkai0
  1348.  
  1349. rle4_tenkai4_:
  1350.     lsr.w    #1,d0
  1351.     subq.w    #1,d0
  1352.     move.w    d0,d5
  1353. rle4_tenkai4__:
  1354.     move.b    (a0)+,d1
  1355.     rol.b    #4,d1
  1356.     bsr    set
  1357.     rol.b    #4,d1
  1358.     bsr    set
  1359.     dbra.w    d0,rle4_tenkai4__
  1360.     move.b    (a0)+,d1
  1361.     rol.b    #4,d1
  1362.     bsr    set
  1363.     btst.l    #0,d5
  1364.     beq    rle4_tenkai4___
  1365.     addq.l    #1,a0
  1366. rle4_tenkai4___:
  1367.     bra    rle4_tenkai0
  1368.  
  1369. rle4_tenkai5:
  1370.     tst.w    d3
  1371.     beq    rle4_tenkai5_
  1372.     bsr    set
  1373. rle4_tenkai5_:
  1374.     adda.w    line_byte1(a6),a3    *展開アドレスの補正
  1375.     movea.l    a3,a1
  1376.     bra    rle4_tenkai0
  1377.  
  1378. rle4_tenkai9:
  1379.     tst.w    d3
  1380.     beq    rle4_tenkai9_
  1381.     bsr    set
  1382. rle4_tenkai9_:
  1383.     bsr    tenkai_move
  1384.     rts
  1385.  
  1386. set:
  1387.     move.w    d1,d4
  1388.     and.w    d7,d4
  1389.     rol.w    #4,d2
  1390.     or.w    d4,d2
  1391.     not.w    d3
  1392.     bne    set9
  1393.     move.b    d2,(a1)+
  1394.     moveq.l    #0,d2
  1395. set9:
  1396.     rts
  1397.  
  1398. *****************************************************************
  1399. *    RLE8圧縮の展開                        *
  1400. *****************************************************************
  1401. rle8_tenkai:
  1402.     bsr    compress_read        *圧縮データ読み込む
  1403.  
  1404.     movea.l    a5,a0            *展開元
  1405.     movea.l    a5,a2            *展開元MAX
  1406.     adda.l    d6,a2
  1407.  
  1408.     movea.l    a2,a1            *展開先
  1409.  
  1410.     move.l    a1,d0            *万が一の展開先補正
  1411.     btst.l    #0,d0
  1412.     beq    rle8_tenkai_
  1413.     addq.l    #1,a1
  1414. rle8_tenkai_:
  1415.     movea.l    a1,a3            *取っておく
  1416.     movea.l    a1,a4            *展開先スペア
  1417.  
  1418. rle8_tenkai0:
  1419.     cmpa.l    a0,a2
  1420.     bls    rle8_tenkai9
  1421.  
  1422.     moveq.l    #0,d0
  1423.     move.b    (a0)+,d0
  1424.     beq    rle8_tenkai2
  1425.     move.b    (a0)+,d1
  1426.  
  1427.     subq.w    #1,d0
  1428. rle8_tenkai1:
  1429.     move.b    d1,(a1)+
  1430.     dbra.w    d0,rle8_tenkai1
  1431.     bra    rle8_tenkai0
  1432.  
  1433. rle8_tenkai2:
  1434.     moveq.l    #0,d0
  1435.     move.b    (a0)+,d0
  1436.  
  1437.     cmp.b    #1,d0
  1438.     bcs    rle8_tenkai5
  1439.     beq    rle8_tenkai9
  1440. *    cmp.b    #2,d0            *無視
  1441. *    bne    rle8_tenkai2_
  1442. *    addq.l    #2,a0
  1443. *    bra    rle8_tenkai0_
  1444.  
  1445. rle8_tenkai2_:
  1446.     btst.l    #0,d0            *偶数か
  1447.     bne    rle8_tenkai4        *違う
  1448.  
  1449. rle8_tenkai3:
  1450.     subq.w    #1,d0
  1451. rle8_tenkai3_:
  1452.     move.b    (a0)+,(a1)+
  1453.     dbra.w    d0,rle8_tenkai3_
  1454.     bra    rle8_tenkai0
  1455.  
  1456. rle8_tenkai4:
  1457.     subq.w    #1,d0
  1458. rle8_tenkai4_:
  1459.     move.b    (a0)+,(a1)+
  1460.     dbra.w    d0,rle8_tenkai4_
  1461.     addq.l    #1,a0
  1462.     bra    rle8_tenkai0
  1463.  
  1464. rle8_tenkai5:
  1465.     adda.w    line_byte1(a6),a3    *展開アドレスの補正
  1466.     movea.l    a3,a1
  1467.     bra    rle8_tenkai0
  1468.  
  1469. rle8_tenkai9:
  1470.     bsr    tenkai_move
  1471.     rts
  1472.  
  1473.  
  1474. compress_read:
  1475.     move.w    #0,-(sp)        *シークモード
  1476.     move.l    offbits(a6),-(sp)    *オフセット
  1477.     move.w    in_file(a6),-(sp)
  1478.     DOS    _SEEK
  1479.     addq.l    #8,sp
  1480.     tst.l    d0
  1481.     bmi    read_err
  1482.  
  1483.     movea.l    buff_addr(a6),a5    *圧縮データを読み込む
  1484.     move.l    fi_size(a6),d6
  1485.     sub.l    offbits(a6),d6
  1486.     bsr    file_read
  1487.     rts
  1488.  
  1489.  
  1490. tenkai_move:
  1491.     move.w    line_byte1(a6),d0
  1492.     mulu.w    tate(a6),d0
  1493.     lsr.l    #2,d0
  1494. tenkai_move0:
  1495.     move.l    (a4)+,(a5)+
  1496.     subq.l    #1,d0
  1497.     bne    tenkai_move0
  1498.     rts
  1499.  
  1500. *****************************************************************
  1501. *    パレットデータの設定                    *
  1502. *****************************************************************
  1503. pal_set:
  1504.     cmp.w    #8,iro(a6)
  1505.     bls    pal_set0
  1506.     rts
  1507.  
  1508. pal_set0:
  1509.     movea.l    buff_addr(a6),a5    *パレットデータを読み込む
  1510.     adda.l    #14+64,a5
  1511.     move.l    offbits(a6),d6
  1512.     sub.l    #14+64,d6
  1513.     bmi    pal_set1
  1514.     bsr    file_read
  1515.  
  1516. pal_set1:
  1517.     cmp.w    #8,iro(a6)
  1518.     bcs    pal_set1_
  1519.  
  1520.     tst.b    dflg(a6)
  1521.     bne    d_pal
  1522.  
  1523. pal_set1_:
  1524.     movea.l    pal_addr(a6),a0        *パレットの先頭アドレス
  1525.     lea.l    dpal_buf(a6),a1        *パレットを設定するアドレス
  1526.  
  1527.     move.w    pal_cnt(a6),d0        *パレット数補正
  1528.     cmp.w    #256,d0
  1529.     bls    pal_set2
  1530.     move.w    #256,d0
  1531.  
  1532. pal_set2:
  1533.     subq.w    #1,d0
  1534.     move.w    #$00f8,d7        *マスクデータ
  1535.  
  1536.     cmp.w    #OS2v1,os_type(a6)
  1537.     bne    ps_win3
  1538.  
  1539. ps_os2v1:
  1540.     move.b    (a0)+,d1        *B
  1541.     move.b    (a0)+,d2        *G
  1542.     move.b    (a0)+,d3        *R
  1543.     and.w    d7,d1
  1544.     and.w    d7,d2
  1545.     and.w    d7,d3
  1546.     lsr.w    #2,d1
  1547.     lsl.w    #3,d3
  1548.     lsl.w    #8,d2
  1549.     or.w    d2,d1
  1550.     or.w    d3,d1
  1551.     move.w    d1,(a1)+
  1552.     dbra    d0,ps_os2v1
  1553.     rts
  1554.  
  1555. ps_win3:
  1556.     move.b    (a0)+,d1        *B
  1557.     move.b    (a0)+,d2        *G
  1558.     move.b    (a0)+,d3        *R
  1559.     addq.w    #1,a0
  1560.     and.w    d7,d1
  1561.     and.w    d7,d2
  1562.     and.w    d7,d3
  1563.     lsr.w    #2,d1
  1564.     lsl.w    #3,d3
  1565.     lsl.w    #8,d2
  1566.     or.w    d2,d1
  1567.     or.w    d3,d1
  1568.     move.w    d1,(a1)+
  1569.     dbra    d0,ps_win3
  1570.     rts
  1571.  
  1572. *****************************************************************
  1573. *    ディザ表示用パレットテーブル作成            *
  1574. *****************************************************************
  1575. d_pal:
  1576.     cmp.w    #WIN3,os_type(a6)
  1577.     bne    d_pal_
  1578.     lea.l    d_pal5(pc),a4
  1579.     bra    d_pal0
  1580. d_pal_:
  1581.     lea.l    d_pal5_(pc),a4
  1582.  
  1583. d_pal0:
  1584.     movea.l    pal_addr(a6),a0        *パレットアドレス
  1585.     lea.l    dpal_buf(a6),a1
  1586.     lea.l    d_pat(pc),a2
  1587.     movea.l    a0,a3
  1588.  
  1589.     move.w    #$00f8,d7        *マスクデータ
  1590.     move.w    #$f800,d3
  1591.     move.w    #$07c0,d4
  1592.  
  1593.     moveq.l    #16-1,d5        *ループ2
  1594. d_pal1:
  1595.     move.w    #256-1,d6        *ループ1
  1596.     move.b    (a2),d0
  1597. d_pal2:
  1598.     move.b    (a0)+,d1        *B
  1599.     add.b    d0,d1
  1600.     bcc    d_pal2_
  1601.     moveq.l    #31*2,d1
  1602.     bra    d_pal3
  1603. d_pal2_:
  1604.     and.w    d7,d1
  1605.     lsr.b    #2,d1
  1606.  
  1607. d_pal3:
  1608.     move.b    (a0)+,d2        *G
  1609.     add.b    d0,d2
  1610.     bcc    d_pal3_
  1611.     or.w    d3,d1
  1612.     bra    d_pal4
  1613. d_pal3_:
  1614.     and.w    d7,d2
  1615. *    ror.w    #8,d2
  1616.     move.b    d2,-(sp)        *ror.w    #8,d2の代わり
  1617.     move.w    (sp)+,d2        *
  1618.     clr.b    d2            *
  1619.     or.w    d2,d1
  1620.  
  1621. d_pal4
  1622.     move.b    (a0)+,d2        *R
  1623.     add.b    d0,d2
  1624.     bcc    d_pal4_
  1625.     or.w    d4,d1
  1626.     bra    d_pal5
  1627. d_pal4_
  1628.     and.w    d7,d2
  1629.     rol.w    #3,d2
  1630.     or.w    d2,d1
  1631.     jmp    (a4)
  1632.  
  1633. d_pal5                    *Win3
  1634.     move.w    d1,(a1)+
  1635.     addq.l    #1,a0
  1636.     dbra    d6,d_pal2
  1637.     movea.l    a3,a0
  1638.     addq.l    #1,a2
  1639.     dbra    d5,d_pal1
  1640.     rts
  1641.  
  1642. d_pal5_                    *OS/2 V1
  1643.     move.w    d1,(a1)+
  1644.     dbra    d6,d_pal2
  1645.     movea.l    a3,a0
  1646.     addq.l    #1,a2
  1647.     dbra    d5,d_pal1
  1648.     rts
  1649.  
  1650. *****************************************************************
  1651. *    セーブ名の作成                        *
  1652. *****************************************************************
  1653. save_name_set:
  1654.     lea.l    filbuf(a6),a1        *転送元
  1655.     lea.l    30(a1),a1
  1656.     movea.l    nameichi(a6),a0        *転送先
  1657.     bsr    strcpy            *ファイル名を複写する
  1658.  
  1659.     bsr    cheng_ext        *拡張子変更
  1660.     rts
  1661.  
  1662. *****************************************************************
  1663. *    拡張子を変更する                    *
  1664. *****************************************************************
  1665. cheng_ext:
  1666.     lea.l    arg2(a6),a0        *ファイル名のアドレス
  1667.     lea.l    cext(pc),a1
  1668. cheng_ext0:
  1669.     cmp.b    #".",(a0)+        *拡張子があるか
  1670.     bne    cheng_ext0
  1671.     subq.l    #1,a0            *行きすぎたから1つ戻る
  1672. cheng_ext1:
  1673.     move.b    (a1)+,(a0)+        *1文字転送
  1674.     bne    cheng_ext1        *終了コードまで繰り返す
  1675. cheng_ext2:
  1676.     rts
  1677.  
  1678. *****************************************************************
  1679. *    表示関係                        *
  1680. *****************************************************************
  1681. prt0:                    *表示バッファ初期化
  1682.     movem.l    d0/a0,-(sp)
  1683.     lea.l    prt_buff(a6),a0
  1684.     moveq.l    #96-1,d0
  1685. prt0_:
  1686.     move.b    #SPACE,(a0)+
  1687.     dbra.w    d0,prt0_
  1688.     clr.b    (a0)+
  1689.     movem.l    (sp)+,d0/a0
  1690.     rts
  1691.  
  1692.  
  1693. prt1:                    *ファイル名とサイズ表示
  1694.     movem.l    d0/a0-a1,-(sp)
  1695.  
  1696.     lea.l    prt_buff(a6),a0
  1697.     lea.l    filbuf(a6),a1
  1698.     lea.l    30(a1),a1
  1699.     bsr    strcpy
  1700.     move.b    #SPACE,(a0)
  1701.  
  1702.     lea.l    prt_buff(a6),a0        *位置合わせ
  1703.     adda.l    #22,a0
  1704.  
  1705.     move.b    #"(",(a0)+        *画像サイズ
  1706.     move.w    yoko(a6),d0
  1707.     bsr    dec_set
  1708.     move.b    #",",(a0)+
  1709.     move.w    tate(a6),d0
  1710.     bsr    dec_set
  1711.     move.b    #")",(a0)+
  1712.  
  1713.     move.w    iro(a6),d0        *bit数
  1714.     bsr    dec_set
  1715.     lea.l    bit_mes(pc),a1
  1716.     bsr    strcpy
  1717.  
  1718.     lea.l    crlf_mes(pc),a1
  1719.     bsr    strcpy
  1720.     lea.l    prt_buff(a6),a0
  1721.     bsr    mesput
  1722.     movem.l    (sp)+,d0/a0-a1
  1723.     rts
  1724.  
  1725.  
  1726. prt2:                    *変換ライン数表示
  1727.     movem.l    d0-d1/a0-a1,-(sp)
  1728.  
  1729.     lea.l    prt_buff(a6),a0
  1730.  
  1731.     addq.w    #1,line_cnt(a6)
  1732.     move.w    line_cnt(a6),d0
  1733.     bsr    dec_set
  1734.     move.b    #"/",(a0)+
  1735.     move.w    tate(a6),d0
  1736.     bsr    dec_set
  1737.  
  1738.     lea.l    henkan_mes(pc),a1
  1739.     bsr    strcpy
  1740.     lea.l    crlf_mes(pc),a1
  1741.     bsr    strcpy
  1742.  
  1743.     IOCS    _B_UP_S
  1744.     moveq.l    #42,d1
  1745.     IOCS    _B_RIGHT
  1746.     lea.l    prt_buff(a6),a0
  1747.     bsr    mesput
  1748.     movem.l    (sp)+,d0-d1/a0-a1
  1749.     rts
  1750.  
  1751.  
  1752. prt3:                    *'終了!'表示
  1753.     movem.l    d0-d1/a0-a1,-(sp)
  1754.     lea.l    prt_buff(a6),a0
  1755.     lea.l    syuryo_mes(pc),a1
  1756.     bsr    strcpy
  1757.     lea.l    crlf_mes(pc),a1
  1758.     bsr    strcpy
  1759.  
  1760.     IOCS    _B_UP_S
  1761.     moveq.l    #51,d1
  1762.     IOCS    _B_RIGHT
  1763.     lea.l    prt_buff(a6),a0
  1764.     bsr    mesput
  1765.     movem.l    (sp)+,d0-d1/a0-a1
  1766.     rts
  1767.  
  1768.  
  1769. dec_set
  1770.     move.l    a0,-(sp)
  1771.     ext.l    d0
  1772.     lea.l    dec_buf(a6),a0
  1773.     bsr    bin2dec
  1774.     bsr    zero_keshi
  1775.     move.l    (sp)+,a0
  1776.     lea.l    dec_buf(a6),a1
  1777.     addq.l    #6,a1
  1778.     bsr    strcpy
  1779.     rts
  1780.  
  1781. *****************************************************************
  1782. *    2進=>10進                        *
  1783. *    d0 変換元の数値 a0 変換後の格納アドレス            *
  1784. *****************************************************************
  1785. bin2dec:
  1786.     movem.l    d0-d3/a0-a1,-(sp)
  1787.     moveq.l    #10-1,d1
  1788.     lea.l    exp_tbl(pc),a1
  1789. bin2dec0:
  1790.     clr.b    d2
  1791.     move.l    (a1)+,d3
  1792. bin2dec1:
  1793.     or    d3,d3
  1794.     sub.l    d3,d0
  1795.     bcs    bin2dec2
  1796.     addq.b    #1,d2
  1797.     bra    bin2dec1
  1798. bin2dec2:
  1799.     add.l    d3,d0
  1800.     add.b    #'0',d2
  1801.     move.b    d2,(a0)+
  1802.     dbra    d1,bin2dec0
  1803.     movem.l    (sp)+,d0-d3/a0-a1
  1804.     rts
  1805.  
  1806. exp_tbl:
  1807.     .dc.l    1000000000
  1808.     .dc.l    100000000
  1809.     .dc.l    10000000
  1810.     .dc.l    1000000
  1811.     .dc.l    100000
  1812.     .dc.l    10000
  1813.     .dc.l    1000
  1814.     .dc.l    100
  1815.     .dc.l    10
  1816.     .dc.l    1
  1817.  
  1818. *****************************************************************
  1819. *    ファイルサイズの頭にある'0'を消す            *
  1820. *****************************************************************
  1821. zero_keshi:
  1822.     lea.l    dec_buf(a6),a0
  1823.     moveq.l    #9-1,d0
  1824. zero_keshi0:
  1825.     cmp.b    #'0',(a0)
  1826.     bne    zero_keshi9
  1827.     move.b    #SPACE,(a0)+
  1828.     dbra.w    d0,zero_keshi0
  1829. zero_keshi9:
  1830.     rts
  1831.  
  1832. *****************************************************************
  1833. *    ファイルのOPENを行う                *
  1834. *****************************************************************
  1835. file_open:
  1836.     move.w    #0,-(sp)        *ファイルopen
  1837.     move.l    a0,-(sp)
  1838.     DOS    _OPEN
  1839.     addq.l    #6,sp
  1840.     tst.l    d0
  1841.     bmi    open_err
  1842.     move.w    d0,in_file(a6)
  1843.     rts
  1844.  
  1845. *****************************************************************
  1846. *    ファイルのサイズを求める(d6に返す)            *
  1847. *****************************************************************
  1848. file_size:
  1849.     move.w    #2,-(sp)
  1850.     move.l    #0,-(sp)
  1851.     move.w    in_file(a6),-(sp)
  1852.     DOS    _SEEK
  1853.     addq.l    #8,sp
  1854.     tst.l    d0            *OK?
  1855.     bmi    read_err
  1856.  
  1857.     move.l    d0,d6
  1858.  
  1859.     move.w    #0,-(sp)
  1860.     move.l    #0,-(sp)
  1861.     move.w    in_file(a6),-(sp)
  1862.     DOS    _SEEK
  1863.     addq.l    #8,sp
  1864.     tst.l    d0            *OK?
  1865.     bmi    read_err
  1866.     rts
  1867.  
  1868. *****************************************************************
  1869. *    ディスクからデータの読み込みを行う            *
  1870. *****************************************************************
  1871. file_read:
  1872.     move.l    d6,-(sp)        *データサイズ
  1873.     move.l    a5,-(sp)        *バッファアドレス
  1874.     move.w    in_file(a6),-(sp)
  1875.     DOS    _READ
  1876.     lea    10(sp),sp
  1877.     tst.l    d0
  1878.     bmi    read_err
  1879.     cmp.l    d6,d0
  1880.     bne    read_err
  1881.     rts
  1882.  
  1883. *****************************************************************
  1884. *    ファイル作成                        *
  1885. *****************************************************************
  1886. file_create:
  1887.     move.w    #$20,-(sp)        *ファイルCREATE
  1888.     move.l    a0,-(sp)
  1889.     DOS    _CREATE
  1890.     addq.l    #6,sp
  1891.  
  1892.     tst.l    d0
  1893.     bmi    create_err
  1894.     move.w    d0,out_file(a6)
  1895.     rts
  1896.  
  1897. *****************************************************************
  1898. *    ディスクに書き込む                    *
  1899. *****************************************************************
  1900. file_write:
  1901.     move.l    d6,-(sp)        *データサイズ
  1902.     move.l    a5,-(sp)        *バッファアドレス
  1903.     move.w    out_file(a6),-(sp)
  1904.     DOS    _WRITE
  1905.     lea.l    10(sp),sp
  1906.     tst.l    d0
  1907.     bmi    write_err
  1908.     cmp.l    d6,d0
  1909.     bne    write_err
  1910.     rts
  1911.  
  1912. *****************************************************************
  1913. *    バッファ確保                        *
  1914. *****************************************************************
  1915. buf_get:
  1916.     pea.l    -1.w            *確保出来る最大サイズを取得
  1917.     DOS    _MALLOC
  1918.     addq.l    #4,sp
  1919.     andi.l    #$00ffffff,d0
  1920.     move.l    d0,d1
  1921.     move.l    d0,-(sp)
  1922.     DOS    _MALLOC
  1923.     addq.l    #4,sp
  1924.     tst.l    d0
  1925.     bmi    no_buff
  1926.  
  1927.     move.l    d0,buff_addr(a6)    *バッファアドレス
  1928.     move.l    d1,buff_size(a6)    *バッファサイズ
  1929.     rts
  1930.  
  1931. *****************************************************************
  1932. *    ファイルクローズ                    *
  1933. *****************************************************************
  1934. file_close1:
  1935.     move.w    in_file(a6),-(sp)
  1936.     DOS    _CLOSE
  1937.     addq.l    #2,sp
  1938.     rts
  1939.  
  1940. file_close2:
  1941.     move.w    out_file(a6),-(sp)
  1942.     DOS    _CLOSE
  1943.     addq.l    #2,sp
  1944.     rts
  1945.  
  1946. *****************************************************************
  1947. *    バッファ開放                        *
  1948. *****************************************************************
  1949. buf_free:
  1950.     pea.l    buff_addr(a6)        *バッファ開放
  1951.     DOS    _MFREE
  1952.     addq.l    #4,sp
  1953.     rts
  1954.  
  1955. *****************************************************************
  1956. *    処理したファイル数をチェックする            *
  1957. *****************************************************************
  1958. file_cnt_chk:
  1959.     tst.w    file_cnt(a6)        *処理したファイルは0個か
  1960.     bne    file_cnt_chk1        *違う
  1961.     lea.l    no_file_mes(pc),a0
  1962.     bsr    mesput
  1963. file_cnt_chk1:
  1964.     rts
  1965.  
  1966. *****************************************************************
  1967. *    サポートしていないBMP                    *
  1968. *****************************************************************
  1969. no_support_err:
  1970.     lea.l    arg1(a6),a0
  1971.     bsr    mesput
  1972.     lea.l    no_support_mes(pc),a0
  1973.     bsr    mesput
  1974.     rts
  1975.  
  1976. *****************************************************************
  1977. *    色違い                            *
  1978. *****************************************************************
  1979. but_col_err:
  1980.     lea.l    arg1(a6),a0
  1981.     bsr    mesput
  1982.     lea.l    but_col_mes(pc),a0
  1983.     bsr    mesput
  1984.     rts
  1985.  
  1986. *****************************************************************
  1987. *    メモリが足りない                    *
  1988. *****************************************************************
  1989. no_buff:
  1990.     lea.l    arg1(a6),a0
  1991.     bsr    mesput
  1992.     lea.l    no_buff_mes(pc),a0
  1993.     bsr    mesput
  1994.     rts
  1995.  
  1996. *****************************************************************
  1997. *    ファイル名エラー                    *
  1998. *****************************************************************
  1999. name_er:
  2000.     lea.l    in_mes(pc),a0
  2001.     bsr    mesput
  2002.     lea.l    name_er_mes(pc),a0
  2003.     bsr    mesput
  2004.     bra    exit2
  2005.  
  2006. *****************************************************************
  2007. *    ファイルエラー                        *
  2008. *****************************************************************
  2009. file_er:
  2010.     move.w    in_file(pc),-(sp)    *ファイルCLOSE
  2011.     DOS    _CLOSE
  2012.     addq.l    #2,sp
  2013.  
  2014.     lea.l    arg1(a6),a0
  2015.     bsr    mesput
  2016.     lea.l    file_er_mes(pc),a0
  2017.     bsr    mesput
  2018.     bra    exit2
  2019.  
  2020. *****************************************************************
  2021. *    ファイルが見付からない                    *
  2022. *****************************************************************
  2023. open_err:
  2024.     lea.l    arg1(a6),a0
  2025.     bsr    mesput
  2026.     lea.l    open_er_mes(pc),a0
  2027.     bsr    mesput
  2028.     bra    exit2
  2029.  
  2030. *****************************************************************
  2031. *    読み込みエラー                        *
  2032. *****************************************************************
  2033. read_err:
  2034.     lea.l    arg1(a6),a0
  2035.     bsr    mesput
  2036.     lea.l    read_er_mes(pc),a0
  2037.     bsr    mesput
  2038.     bra    exit2
  2039.  
  2040. *****************************************************************
  2041. *    出力パス名エラー                    *
  2042. *****************************************************************
  2043. out_name_err:
  2044.     lea.l    out_mes(pc),a0
  2045.     bsr    mesput
  2046.     lea.l    name_er_mes(pc),a0
  2047.     bsr    mesput
  2048.     bra    exit2
  2049.  
  2050. *****************************************************************
  2051. *    ファイル作成エラー                    *
  2052. *****************************************************************
  2053. create_err:
  2054.     lea.l    arg2(a6),a0
  2055.     bsr    mesput
  2056.     lea.l    create_er_mes(pc),a0
  2057.     bsr    mesput
  2058.     bra    exit2
  2059.  
  2060. *****************************************************************
  2061. *    ファイル書き込みエラー                    *
  2062. *****************************************************************
  2063. write_err:
  2064.     lea.l    arg2(a6),a0
  2065.     bsr    mesput
  2066.     lea.l    write_er_mes(pc),a0
  2067.     bsr    mesput
  2068.     bra    exit2
  2069.  
  2070. *****************************************************************
  2071. *    使用方表示                        *
  2072. *****************************************************************
  2073. usage:
  2074.     lea.l    usage_mes(pc),a0
  2075.     bsr    mesput
  2076.     bra    exit2
  2077.  
  2078. *****************************************************************
  2079. *    メッセージ表示                        *
  2080. *****************************************************************
  2081. mesput:
  2082. *    move.w    #STDERR,-(sp)        *標準エラー出力へ
  2083.     move.w    #STDOUT,-(sp)        *標準出力へ
  2084.     move.l    a0,-(sp)        *メッセージを
  2085.     DOS    _FPUTS            *出力する
  2086.     addq.l    #6,sp            *スタック補正
  2087.     rts
  2088.  
  2089. *****************************************************************
  2090. *    終了処理                        *
  2091. *****************************************************************
  2092. exit:
  2093.     IOCS    _MS_INIT        *キーバッファクリア
  2094.     moveq.l    #-1,d1
  2095.     IOCS    _SKEY_MOD
  2096.     move.w    #-1,-(sp)
  2097.     DOS    _KFLUSH
  2098.     addq.l    #2,sp
  2099.     rts
  2100.  
  2101. *****************************************************************
  2102. *    エラー処理2                        *
  2103. *****************************************************************
  2104. exit2:
  2105.     bsr    exit
  2106.     move.w    #1,-(sp)        *終了コード1を持って
  2107.     DOS    _EXIT2            * エラー終了
  2108.  
  2109. *****************************************************************
  2110. *    データエリア                        *
  2111. *****************************************************************
  2112.     .data
  2113.     .even
  2114. usage_mes:
  2115.     .dc.b    'BMP to GLX converter V0.01 by A.MUKAWA',CR,LF
  2116.     .dc.b    '機能:Win標準BMPファイルを マチエールでお馴染みのGLXファイルにコンバートします',CR,LF
  2117.     .dc.b    '用法:BMP2GLX [スイッチ] ファイル名 [セーブ先パス]',CR,LF
  2118.     .dc.b    CR,LF
  2119.     .dc.b    '               /D        マトリクスディザで変換する',CR,LF
  2120.     .dc.b    '               /H        識別ヘッダ"BM"をチェックしない',CR,LF
  2121.     .dc.b    '               /N        上下逆に表示される謎の16bitBMPのときに指定',CR,LF
  2122.     .dc.b    0
  2123.  
  2124. in_mes:
  2125.     .dc.b    '入力ファイル',0
  2126. out_mes:
  2127.     .dc.b    '出力先パス',0
  2128. name_er_mes:
  2129.     .dc.b    '名の指定に間違いがあります!',CR,LF,0
  2130. file_er_mes:
  2131.     .dc.b    ' はBMPファイルではないようです!',CR,LF,0
  2132. but_col_mes:
  2133.     .dc.b    ' は未サポートの色数です!',CR,LF,0
  2134. no_support_mes:
  2135.     .dc.b    ' はサポートしていないBMPフォーマットです!',CR,LF,0
  2136. open_er_mes:
  2137.     .dc.b    ' が見つかりません!',CR,LF,0
  2138. read_er_mes:
  2139.     .dc.b    ' の読み込みエラーが発生しました!',CR,LF,0
  2140. no_buff_mes:
  2141.     .dc.b    ' の変換に必要なメモリがありません!',CR,LF,0
  2142. create_er_mes:
  2143.     .dc.b    ' が作れません!',CR,LF,0
  2144. write_er_mes:
  2145.     .dc.b    ' の書き込みエラーが発生しました!',CR,LF,0
  2146. no_file_mes:
  2147.     .dc.b    '変換できるファイルがありませんでした!',CR,LF,0
  2148. henkan_mes:
  2149.     .dc.b    ' 変換中',0
  2150. syuryo_mes:
  2151.     .dc.b    ' 終了!',0
  2152. bit_mes:
  2153.     .dc.b    'bit',0
  2154. crlf_mes:
  2155.     .dc.b    CR,LF,0
  2156. func_off_mes:
  2157.     .dc.b    $1b,$5b,$3e,$31,$68,0
  2158. sla_mes:
  2159.     .dc.b    '/',0
  2160.  
  2161. dext:
  2162.     .dc.b    '.BMP',0        *補う拡張子
  2163. komekome:
  2164.     .dc.b    '\'
  2165. kome0:
  2166.     .dc.b    '*.BMP',0
  2167. cext:
  2168.     .dc.b    '.GLX',0        *変更する拡張子
  2169.  
  2170. d_pat:
  2171.     .dc.b     0, 4, 1, 5        *ディザパターン1
  2172.     .dc.b     6, 2, 7, 3
  2173.     .dc.b     1, 5, 0, 4
  2174.     .dc.b     7, 3, 6, 2
  2175.  
  2176. *****************************************************************
  2177. *    ワークエリア                        *
  2178. *****************************************************************
  2179.  
  2180.     .offset    0
  2181. dpal_buf:
  2182.     .ds.b    256*2*4*4
  2183. filbuf:
  2184.     .ds.b    53            *ファイル情報格納バッファ
  2185. nambuf:
  2186.     .ds.b    92            *ファイル名展開用バッファ
  2187. arg1:
  2188.     .ds.b    256            *入力ファイル名バッファ
  2189. arg2:
  2190.     .ds.b    256            *出力ファイル名バッファ
  2191. cpathbuf
  2192.     .ds.b    65            *カレントパス名バッファ
  2193. spathbuf
  2194.     .ds.b    65            *セーブ先パス名バッファ
  2195.     .even
  2196. buff_addr:
  2197.     .ds.l    1            *画像読み込みバッファアドレス
  2198. buff_size:
  2199.     .ds.l    1            *画像読み込みバッファサイズ
  2200. gr_addr:
  2201.     .ds.l    1            *画像データアドレス
  2202. fi_size:
  2203.     .ds.l    1            *ファイルサイズ
  2204. offbits:
  2205.     .ds.l    1            *画像データ迄のオフセット
  2206. pal_addr:
  2207.     .ds.l    1            *パレットアドレス
  2208. os_type:
  2209.     .ds.w    1            *OSのタイプ
  2210. pal_cnt:
  2211.     .ds.w    1            *パレット数
  2212. iro:
  2213.     .ds.w    1            *使用色数(BIT)
  2214. compress:
  2215.     .ds.w    1            *圧縮モード
  2216. yoko:
  2217.     .ds.w    1            *画像の横(X)サイズ
  2218. tate:
  2219.     .ds.w    1            *画像の縦(Y)サイズ
  2220. line_byte1:
  2221.     .ds.w    1            *1ラインのバイト数(読み込み側)
  2222. line_byte2:
  2223.     .ds.w    1            *1ラインのバイト数(書き込み側)
  2224. line_cnt:
  2225.     .ds.w    1
  2226. file_cnt:
  2227.     .ds.w    1
  2228. nameichi:
  2229.     .ds.l    1
  2230. in_file:
  2231.     .ds.w    1
  2232. out_file:
  2233.     .ds.w    1
  2234. dec_buf:
  2235.     .ds.b    10+1
  2236. prt_buff:
  2237.     .ds.b    96+1
  2238. dflg:
  2239.     .dc.b    1
  2240. nflg:
  2241.     .dc.b    1
  2242. hflg:
  2243.     .dc.b    1
  2244. skip_flg:
  2245.     .dc.b    1
  2246.     .even
  2247. WORK_SIZE:
  2248.  
  2249.     .bss
  2250.     .even
  2251. work:
  2252.     .ds.b    WORK_SIZE
  2253. my_stack:
  2254.     .ds.l    1024
  2255. mysp:
  2256.     .end    start
  2257.